#include "charger.h"
#include "sc8802.h"
#include "def.h"
#include "output.h"
#include "env.h"
#include "ina226.h"
#include "stdio.h"
#include "analog.h"
#include "math.h"

// 初始化充电器状态
void chargerInit(void)
{
    sc8802Init();
    if (ina226Init() != E_INA226_SUCCESS)
    {
        sprintf(env.message, "MON CHIP ERR!");
        env.error = E_CRITICAL;
    }
}

// 启用充电器核心模块
void chargerEnable(void)
{
    sc8802Ctl(TRUE);
}

// 禁用充电器核心模块
void chargerDisable(void)
{
    sc8802Ctl(FALSE);
}

// 充电器输出使能
void chargerOutputEnable(void)
{
    outputEnable();
}

// 充电器输出禁用
void chargerOutputDisable(void)
{
    outputDisable();
}

// 指示充电器是否完成充电
BOOL isChargingFinished(void)
{
    return sc8802IsChargeOk();
}

// 获得充电器的核心温度（电感附近温度）
float coreTemperature(void)
{
    unsigned int Vntc;
    unsigned int Intc;
    unsigned int B_value = 3950;  /* 你的NTC的B值 */
    unsigned int R_25C = 10000;   /* NTC在25摄氏度时的电阻值 */
    unsigned int R_ntc = 0;       /* 你的热敏电阻阻值 */
    unsigned int R = 10000;       /* 分压电阻值 */
    unsigned int V_supply = 3300; // 3.3V 转换为毫伏

    // 替换为你的实际电阻值和电源电压
    Vntc = analogGetValue(ANALOG_NTC, 10) * 3300 / 4096; // 读取NTC电压，单位mv

    // V分压(mv) / R = I(ma)
    Intc = (V_supply - Vntc) * 1000 / R; // 电流，单位ua

    // 电阻值 = 电压/电流
    R_ntc = Vntc * 1000 / Intc; // 电阻值，单位欧姆

    // 计算温度
    float temperature = 1 / (log((float)R_ntc / R_25C) / B_value + 1 / 298.15) - 273.15;
    return temperature;
}

// 设置充电器最大电流
void setChargerMaxCurrent(float current)
{
    sc8802SetCurrent(current);
}

// 设置MTTP
void setMTTPTrackerVolt(MTTP_TRACKER mttp)
{
    sc8802SetMPTTVoltage(mttp);
}
// 获得入口电压
float getInputVoltage(void)
{
    // 输入电压通过VCC-10k-1k-GND关系串联在一起,计算电阻分压后通过运算获得输入电压
    unsigned int Vraw = analogGetValue(ANALOG_VCC, 10); // 假设这个函数可以从硬件读取原始电压值
    Vraw = Vraw * 3300 / 4096;                          // 转换为毫伏
    unsigned int R1 = 10000;                            // 10k电阻
    unsigned int R2 = 1000;                             // 1k电阻
    return Vraw * 0.001 * (R1 + R2) / R2;
}

// 获得出口电压，不受mos隔离影响
float getOutputVoltage(void)
{
    return ina226GetVoltage();
}

// 获得出口电流
float getOutputCurrent(void)
{
    return ina226GetCurrent();
}
